package com.hex.ds.hdrs;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.hex.bigdata.hbda.utils.RSAUtil;
import com.hex.ds.hdrs.center.service.CenterManager;
import com.hex.ds.hdrs.common.constant.ErrorCode;
import com.hex.ds.hdrs.common.exception.BizException;
import com.hex.ds.hdrs.common.utils.HdrsDateUtil;
import com.hex.ds.hdrs.common.utils.MacUtil;
import com.hex.ds.hdrs.engine.service.GrabDbExecService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

/**
 * @Package: com.hex.ds.hdrs
 * @ClassName HdrsClrImpl
 * @Description: 启动
 * @Author: jd.chen
 * @Date 2021/7/29 17:52
 * @Version v1.0
 **/
@Slf4j
@Component
public class HdrsClrImpl implements CommandLineRunner {

    @Value("${license.encrypt-info}")
    private String licenseEncryptInfo;

    @Value("${license.private-key}")
    private String licensePrivateKey;

    @Value("${license.check-mac:true}")
    private boolean checkMacFlag;

    @Autowired
    private CenterManager centerManager;

    @Autowired
    private GrabDbExecService grabDbExecService;

    /**
     * @Method: run
     * @Param: [args]
     * @Return: void
     * @Description： 初始化程序
     * @Author： jd.chen
     * @Date： 2021/6/28 18:54
     * @Version： V1.0
     */
    @Override
    public void run(String... args) throws Exception {
        log.info("【调度中心启动】-1、检查license是否有效！");
        licenseInit();
        log.info("【调度中心启动】-2、调度中心信息注册！");
        centerManager.centerInit();
        log.info("【调度中心启动】-3、启动抢占中心异步任务！");
        grabDbExecService.grabDbExec();
        log.info("【调度中心启动】-4、启动抢占中心异步任务成功！");
    }

    /**
     * @Method: licenseInit
     * @Param: []
     * @Return: void
     * @Description： license初始化
     * @Author： jd.chen
     * @Date： 2021/6/28 18:56
     * @Version： V1.0
     */
    public void licenseInit() {
        try {
            JSONObject licenseJson = this.getLicenseJson();

            int maxAgentNum = (int) licenseJson.get("agentNum");
            int maxTaskNum = (int) licenseJson.get("taskNum");
            int maxConcurrentNum = (int) licenseJson.get("concurrentNum");
            boolean clusterFlag = (boolean) licenseJson.get("clusterFlag");
            long expirationDate = (Long) licenseJson.get("expiration");

            if (this.checkMacFlag) {
                String macAddr = (String) licenseJson.get("macAddr");
                this.validMacAddr(macAddr);
            }
            this.validExpirationDate(expirationDate);

            centerManager.setMaxConcurrentNum(maxConcurrentNum);
            centerManager.setMaxAgentNum(maxAgentNum);
            centerManager.setMaxTaskNum(maxTaskNum);
            centerManager.setClusterFlag(clusterFlag);
        } catch (Exception e) {
            log.error("调度中心启动：license认证异常:{}", e.getMessage(), e);
            throw e;
        }
    }

    /**
     * @Method: validMacAddr
     * @Param: [macAddr]
     * @Return: void
     * @Description： 校验mac地址
     * @Author： jd.chen
     * @Date： 2021/6/30 17:09
     * @Version： V1.0
     */
    public void validMacAddr(String macAddr) {
        try {
            List<String> macAddrList = MacUtil.getMacList();
            for (String centerMacAddr : macAddrList) {
                if (macAddr.equals(centerMacAddr)) {
                    return;
                }
            }
            throw new BizException(ErrorCode.ERROR_830004);
        } catch (Exception e) {
            throw new BizException(ErrorCode.ERROR_830005);
        }
    }

    /**
     * @Method: validExpirationDate
     * @Param: [expirationDate]
     * @Return: void
     * @Description： 校验有效期
     * @Author： jd.chen
     * @Date： 2021/6/30 17:12
     * @Version： V1.0
     */
    public void validExpirationDate(long expirationDate) {
        Date curDate = new Date();
        if (expirationDate < curDate.getTime()) {
            String expDate = HdrsDateUtil.msToDateStr(expirationDate);
            log.error("license已过期，到期日：{}", expDate);
            throw new BizException(ErrorCode.ERROR_830002);
        }
    }

    /**
     * @Method: getLicenseJson
     * @Param: []
     * @Return: cn.hutool.json.JSONObject
     * @Description： 获取license信息
     * @Author： jd.chen
     * @Date： 2021/6/28 18:56
     * @Version： V1.0
     */
    public JSONObject getLicenseJson() {
        try {
            String licenseInfo = RSAUtil.rsaDecrypt(licensePrivateKey, licenseEncryptInfo);
            JSONObject licenseJson = JSONUtil.parseObj(licenseInfo);
            return licenseJson;
        } catch (Exception e) {
            throw new BizException(ErrorCode.ERROR_830003);
        }
    }
}
